<?php

/**
 * Représente un formulaire
 *
 * @package cass
 * @author Mickaël CASTANHEIRO <mickael.castanheiro@gmail.com>
 * @version 1.0
 */

namespace cass\formulaire;

class Formulaire extends \cass\Element {

    protected $name;
    protected $slug;
    protected $template;
    protected $buttons;
    protected $method;
    protected $action;
    protected $fields;
    protected $links;
    protected $enctype;
    protected $confirm;

    /**
     * Constructeur de l'Action
     */
    public function __construct($_name = 'Formulaire') {
        $this->setName($_name);
        $this->setSlug(slugify($_name));
        $this->setTemplate('_form');
        $this->buttons = array('submit' => 'Valider');
        $this->method = 'post';
        $this->links = array();
        $this->enctype = false;
        $this->action = $_SERVER['REQUEST_URI'];
    }

    /**
     * Récupère un champ
     * @param <string> $_name Nom du champ
     */
    public function __get($_name) {
        return $this->fields[slugify($_name)];
    }

    /**
     * Récupère la valeur d'un champ
     */
    public function getValue($_name) {
        return $this->fields[slugify($_name)]->getValue();
    }

    /**
     * Ajoute un champ au formulaire
     * @param <Field> Champ de formulaire
     */
    public function append($_field) {
        $this->addToFields($_field->getSlug(), $_field);
        $_field->setFormulaire($this);
        if ( is_a($_field, '\cass\Formulaire\InputFile') ) {
            $this->setEnctype(true);
        }
    }

    /**
     * Indique si le formulaire a été posté
     * @return <boolean> Formulaire soumis ?
     */
    public function isSubmitted() {
        $POST = ( $this->getMethod() == 'post' ) ? $_POST : $_GET;
        return isset($POST[$this->getSlug() . '-submit']);
    }

    /**
     * Indique si un formulaire a été soumis
     * s'il l'est, bind les champs
     * @return <boolean> Formulaire soumis ?
     */
    public function isPosted() { 
        if ($this->isSubmitted()) {
            $this->bindFields();
            return true;
        }
        return false;
    }

    /**
     * Rempli les champs avec les valeurs post
     */
    private function bindFields() {
        if (!$this->isSubmitted())
            return;

        foreach ($this->getFields() AS $field) {
            $field->bind();
        }
    }

    /**
     * Indique si le formulaire a été posté et qu'il
     * n'y a aucune erreur
     */
    public function isPostedWithoutError() {
        return ( $this->isSubmitted() AND !$this->isError() );
    }

    /**
     * Indique si le formulaire comporte des erreurs
     */
    public function isError() {
        foreach ($this->getFields() AS $field) {
            if ($field->isError()) {
                return true;
            }
        }
        return false;
    }

    /**
     * Affiche le rendu du formulaire
     */
    public function render() {
        $template = new \cass\Template;
        if ($this->isConfirm()) {
            $template->setName('_formConfirm');
            $template->setVars(array(
                'message' => $this->getConfirm(),
            ));
        }
	else {
            $template->setName($this->getTemplate());
            $template->setVars(array(
                'name' => $this->getName(),
                'slug' => $this->getSlug(),
                'buttons' => $this->getButtons(),
                'fields' => $this->getFields(),
                'method' => $this->getMethod(),
                'action' => $this->getAction(),
                'isEnctype' => $this->isEnctype(),
                'links' => $this->getLinks(),
            ));
        }

        $template->render();
    }

}

?>
